/**
  ******************************************************************************
  * @file    adc.c
  * @author  ashuai0110
  * @version V1.0
  * @date    2024-01-27
  * @brief   adc驱动,适用于PIC16(L)F1788_9
  *
  ******************************************************************************
  * @attention
  *
  * Change Logs:
  * Date          Author        Notes
  * 2024-01-25    ashuai0110    完成基本内容
  *
  ******************************************************************************
  */

/* 包含头文件-----------------------------------------------------------------*/
#include "adc.h"

/* 私有宏定义-----------------------------------------------------------------*/

/* 私有类型定义---------------------------------------------------------------*/

/* 私有变量-------------------------------------------------------------------*/

/* 全局变量-------------------------------------------------------------------*/

/* 私有函数原型---------------------------------------------------------------*/

/**
  * @brief  adc初始化
  * @param  config : adc配置参数结构体
  * @retval None
  */
void adc_init(adc_config_t config)
{
    ADRESH = 0;
    ADRESL = 0;
    ADCON0 = (config.resultMode << 7) | (config.positiveCh << 2);
    ADCON1 = (config.resultFormat << 7) | (config.clkSource << 4) | (config.negativeVoltage << 2) | config.positiveVoltage;
    ADCON2 = (config.autoConvert << 4) | config.negativeCh;
    
    ADC_CMD(0);
}

/**
  * @brief  adc取消初始化(恢复缺省)
  * @param  None
  * @retval None
  */
void adc_de_init(void)
{
    ADRESH = 0;
    ADRESL = 0;
    ADCON0 = 0;
    ADCON1 = 0;
    ADCON2 = 0;
}

/**
  * @brief  adc转换
  * @param  positiveCh : adc输入通道 @ref adc_chs
  * @retval adc采样值
  */
uint16_t adc_convert(uint8_t positiveCh)
{
    uint8_t cnt = 1;
    
    ADCON0bits.CHS = positiveCh; /* 设置正差分输入通道 */
    ADC_CMD(1);
    while(cnt--); /* 使能adc后延时一段时间使充电完全 一般为几微秒 */
    ADGO = 1;
    while(ADGO == 1);
    
    return ((ADRESH << 8) | ADRESL);
}

